package servidor;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;





public class Servidor1 {

	
	static final int PUERTO=5000; //puerto en el cual escucho a los clientes
	
	ArrayList<Socket> listaClientes;
	int x,y;
	
	public static void main(String[] args) {
		String a ="a";
		Servidor1 s = new Servidor1();
	}
	
	
	public Servidor1(){
		System.out.println("Escucho en el puerto :"+PUERTO);
		listaClientes = new ArrayList<Socket>();
		x=0;
		y=0;
		
		try {
			//Creo un socket que escucha a los clientes en  PUERTO
			ServerSocket skServidor = new ServerSocket( PUERTO );
			//se crea un ciclo permanente para escuchar a todos los clientes que lleguen
			while(true){
				//se crea un socket por cada cliente que llegue y se crea un hilo que lo atienda
				Socket skCliente = skServidor.accept();
				//agrego el nuevo cliente la lista de clientes
				listaClientes.add(skCliente);
				Runnable nuevoCliente = new HiloAtiendeCliente(skCliente);
				Thread hilo = new Thread(nuevoCliente);
				hilo.start();	
				System.out.println("LLEGO UN CLIENTE");
			}
	
		} 
		catch( Exception e ) {
	
			System.out.println( e.getMessage() );
	
		}
		
		
	}
	
	
	private class HiloAtiendeCliente implements Runnable{
		
		DataInputStream flujoEntrada; 
		
		public HiloAtiendeCliente(Socket socket){
			
			try {
				
				InputStream aux = socket.getInputStream();
				//genera el flujo de entrada, por aca RECIBO los mensajes que vienen de este cliente
				flujoEntrada = new DataInputStream( aux );
				
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			
			
			
		}
		
		public void run() {

			//creo un lazo que esta continuamente esperando mensajes del cliente al que atiende
			while(true){
				try {
					System.out.println("Espero Coordenadas x,y");
					//asumo que los mensajes se envian en este orden, primero x y luego y	
					x=Integer.parseInt(flujoEntrada.readUTF());
					y=Integer.parseInt(flujoEntrada.readUTF());
					System.out.println("SERVIDOR: X: "+x+" Y: "+y);
					//despues de recibir una actualizacion , actualizo a todos los demas clientes
					actualizarClientes();
					
				} catch (NumberFormatException | IOException e) {
					
					e.printStackTrace();
				}
			}
			
		}
	}
	
	private void actualizarClientes() {
		Iterator i = listaClientes.iterator();
		Socket socket;
		DataOutputStream flujoSalida;
		//recorro toda la lista actualizando a los clientes con la nueva informacion
		while(i.hasNext()){
			
			try {
				System.out.println("actualizo clientes ");				
				//hago los preparativos para enviar el mensaje
				socket = (Socket)i.next();
				OutputStream aux = socket.getOutputStream();
				flujoSalida= new DataOutputStream( aux );
				
				//envio el mensaje , primero x y luego y
				flujoSalida.writeUTF(""+x);
				flujoSalida.writeUTF(""+y);
				
			
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
	}
	
	/*public static void main(String[] args) {
		new Servidor1();

	}*/

}
